// 进行axios二次封装：使用请求与响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
// 引入用户相关的仓库
import useUserStore from '@/store/modules/user'
// 第一步：利用axios对象的create方法，去创建axios实例（其他的配置：基础路径、超时的时间）
let request = axios.create({
  //基础路径
  baseURL: '/api', //使用baseURL前缀，指向本地node服务
  timeout: 5000 //超时的时间的设置
})
// 第二步：request实例添加请求与响应拦截器
request.interceptors.request.use((config) => {
  // 从本地存储获取token
  const token = localStorage.getItem('TOKEN')
  if(token){
    // 使用标准的Authorization header格式
    config.headers.Authorization = `Bearer ${token}`
  }
  // config配置对象，headers属性请求头，经常给服务器端携带公共参数
  //返回配置对象
  return config
})

// 第三步：响应拦截器
request.interceptors.response.use((response) => {
  // 成功的回调
  // 简化数据，直接返回response.data
  return response.data
}, (error)=>{
  // 失败的回调：处理http网络错误的
  // 定义一个变量：存储网络错误信息
  let message = '网络出现问题'
  
  // 检查是否有响应
  if (error.response) {
    // http状态码
    let status = error.response.status
    switch (status) {
      case 401:
        message = 'TOKEN过期或无效'
        break;
      case 403:
        message = '无权访问'
        break;
      case 404:
        message = '请求地址错误'
        break;
      case 500:
        message = '服务器出现问题'
        break;
      default:
        // 尝试从响应中获取错误消息
        if (error.response.data && error.response.data.message) {
          message = error.response.data.message
        } else {
          message = `请求失败 (${status})`
        }
        break;
    }
  } else if (error.request) {
    message = '网络连接失败，请检查后端服务是否启动'
  } else {
    message = error.message || '未知错误'
  }
  
  // 提示错误信息
  ElMessage({
    type: 'error',
    message
  })

  return Promise.reject(error)
})

// 导出request实例
export default request